/*
 * circulars.c
 *
 *  Created on: 11/04/2011
 *      Author: joao
 */

#include <stdlib.h>

#include "circular.h"

void Inicializa(TipoDaPosicao *L){
	*L = NULL;
}

/*o elemento inserido torna-se o novo primeiro*/
void insereInicio(TipoInfo x, No **L){
	No *p;

	extraiNo(&p);
	p->info = x;
	if (*L == NULL){ /*Lista Vazia*/
		p->prox = p;
		*L = p;
	}
	else {
		p->prox = (*L) ->prox;
		(*L)->prox = p;
	}
}

/*o elemento inserido torna-se o novo ultimo*/
void insereFim(TipoInfo x, No **L){
	insereInicio(x, L);
	(*L) = (*L)->prox;
}

/*retira o elemento do inicio da lista*/
void RemoveInicio (TipoInfo *x , No **L){
	No *p; /* Aponta para o elemento que vai ser removido */

	if (*L == NULL)
		underflow () ;
	else {
		p = (*L)->prox;
		*x = p->info;
		if(*L == p) /* Lista com apenas um no */
			*L = NULL;
		else
			(*L)->prox = p->prox;
		devolveNo (p);
	}
}


No *concatena(No *L1 , No *L2){
	No *p;
	No *L ;

	if (L2 == NULL)
		L = L1;
	else {
		if(L1 != NULL){
			p = L1->prox ;
			L1->prox = L2->prox;
			L2->prox = p ;
		}
		L = L2;
	}
	return L;
}

void Libera(No **L){
	No *p;

	if(*L != NULL){
		p = (*L)->prox;
		(*L)->prox = livre;
		livre = p;
		*L = NULL;
	}
}
